import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class NM {
    //找到字符串所有字母异位词；
    //算法题：该定两个字符串，
    // 从其中一个字符串中找到另一个字符串的所有异位词的子串，
    // 并返回这些子串的起始索引；
    public static List<Integer> fun(String ss,String pp){
        //首先将这两个字符串转化成字符数组；
        char[] s=ss.toCharArray();
        char[] p=pp.toCharArray();
        //定义一个顺序表进行存放子串的索引；
        List<Integer> ret =new ArrayList<>();
        //将要被寻找的字符串的每个字母个数放入哈希表中，方便进行统计；
        int[] hash1=new int[26];
        for(char ch:p){
            hash1[ch-'a']++;
        }
        int m=p.length;//顺便进行统计一下该字符串的长度；
        //定义一个新的哈希表进行存放遍历到的子串的情况；
        int[] hash2=new int[26];
        //下面进行滑动窗口操作；
        for(int left=0,right=0,count=0;right<s.length;right++){
            //1.进行进窗口操作；
            char in=s[right];
            hash2[in-'a']++;
            //进入窗口后进行维护操作；
            if(hash2[in-'a']<=hash1[in-'a']){
                count++;
            }
            //接着进行判断何时进行出窗口操作；
            if (right-left+1>m){
                //进行窗口操作前，也需要进行一下维护工作；
                char out=s[left++];
                if(hash2[out-'a']<=hash1[out-'a']){
                    count--;
                }
                //维护工作完成后进行出窗口操作；
                hash2[out-'a']--;
            }
            //进行结果的更新；
            if(count==m){
                ret.add(left);
            }

        }
        return ret;
    }

    public static void main(String[] args){
        String ss="cbaebabacd";
        String pp="abc";
        List<Integer> ret=fun(ss,pp);
        System.out.println(ret);

    }

}
